package com.pop.hive;

import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;

/**
 * @author Pop
 *
 * 做一个输入参数长度的自定义udf函数
 * 一进一出
 * @date 2022/8/18 23:31
 */
public class MyUDF extends GenericUDF {
    /**
     * 初始化，只会执行一次
     *
     * 参数的校验之类
     * @param objectInspectors
     * @return
     * @throws UDFArgumentException
     */
    @Override
    public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {
        if (objectInspectors.length!=1){
            throw new UDFArgumentException("参数长度不对");
        }
        // 返回数字的类型，工厂这个类需要记一下
        return PrimitiveObjectInspectorFactory.javaIntObjectInspector;
    }

    /**
     * 每次进来数据都会执行一次计算
     * @param deferredObjects
     * @return
     * @throws HiveException
     */
    @Override
    public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {
        // 处理数据的方法

        // 取出数据
        String input = deferredObjects[0].get().toString();

        return input!=null?input.length():0;
    }

    /**
     * 对于执行计划的展示，一般写空值
     * @param strings
     * @return
     */
    @Override
    public String getDisplayString(String[] strings) {
        return "";
    }
}
